package com.android.monee.view.activity;

import java.util.List;

import android.app.ActionBar;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.app.NavUtils;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.Menu;
import android.view.MenuItem;

import com.android.monee.domain.BudgetService;
import com.android.monee.view.model.BudgetDetails;
import com.android.monee.R;


public class BudgetsActivity extends FragmentActivity implements
		ActionBar.TabListener {

	public static String CURRENT_BUDGET_ID_FOR_OPEN = "primary_budget_id";

	/**
	 * The {@link android.support.v4.view.PagerAdapter} that will provide
	 * fragments for each of the sections. We use a
	 * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which
	 * will keep every loaded fragment in memory. If this becomes too memory
	 * intensive, it may be best to switch to a
	 * {@link android.support.v4.app.FragmentStatePagerAdapter}.
	 */
	private SectionsPagerAdapter mSectionsPagerAdapter;

	/**
	 * The {@link ViewPager} that will host the section contents.
	 */
	private ViewPager mViewPager;

	private List<BudgetDetails> budgets;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_budgets);

		// Set up the action bar.
		final ActionBar actionBar = getActionBar();
		actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
		// Show the Up button in the action bar.
		actionBar.setDisplayHomeAsUpEnabled(true);

		this.budgets = BudgetDetails.newCollection(BudgetService.findAll(),
				getResources());
		// Create the adapter that will return a fragment for each of the three
		// primary sections of the app.
		mSectionsPagerAdapter = new SectionsPagerAdapter(
				getSupportFragmentManager(), this.budgets);

		// Set up the ViewPager with the sections adapter.
		mViewPager = (ViewPager) findViewById(R.id.pager);
		mViewPager.setAdapter(mSectionsPagerAdapter);

		// When swiping between different sections, select the corresponding
		// tab. We can also use ActionBar.Tab#select() to do this if we have
		// a reference to the Tab.
		mViewPager
				.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
					@Override
					public void onPageSelected(int position) {
						actionBar.setSelectedNavigationItem(position);
					}
				});

		// For each of the sections in the app, add a tab to the action bar.
		for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
			// Create a tab with text corresponding to the page title defined by
			// the adapter. Also specify this Activity object, which implements
			// the TabListener interface, as the callback (listener) for when
			// this tab is selected.
			actionBar.addTab(actionBar.newTab()
					.setText(mSectionsPagerAdapter.getPageTitle(i))
					.setTabListener(this));
		}

		// on positionne le viewPager sur le budget demandé grâce à l'argument
		// CURRENT_BUDGET_ID_FOR_OPEN
		Intent caller = getIntent();
		int currentBudgetId = caller
				.getIntExtra(CURRENT_BUDGET_ID_FOR_OPEN, -1);
		int index = 0;
		for (BudgetService budget : budgets) {
			if (budget.getId() == currentBudgetId)
				break;
			else
				index++;
		}
		mViewPager.setCurrentItem(index);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.budgets_details_common, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {

		int index = mViewPager.getCurrentItem();
		BudgetDetails budget = mSectionsPagerAdapter.getBudget(index);

		switch (item.getItemId()) {
		case android.R.id.home:
			// This ID represents the Home or Up button. In the case of this
			// activity, the Up button is shown. Use NavUtils to allow users
			// to navigate up one level in the application structure. For
			// more details, see the Navigation pattern on Android Design:
			//
			// http://developer.android.com/design/patterns/navigation.html#up-vs-back
			//
			NavUtils.navigateUpFromSameTask(this);
			return true;
		case R.id.budget_details_action_edit:
			// TODO : à implémenter
			return true;
		case R.id.budget_details_action_delete:
			//TODO : popup etes-vous sur ?
			mSectionsPagerAdapter.removeBudget(index);
			getActionBar().removeTabAt(index);
			BudgetService.delete(budget);
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	@Override
	public void onTabSelected(ActionBar.Tab tab,
			FragmentTransaction fragmentTransaction) {
		// When the given tab is selected, switch to the corresponding page in
		// the ViewPager.
		mViewPager.setCurrentItem(tab.getPosition());
	}

	@Override
	public void onTabUnselected(ActionBar.Tab tab,
			FragmentTransaction fragmentTransaction) {
	}

	@Override
	public void onTabReselected(ActionBar.Tab tab,
			FragmentTransaction fragmentTransaction) {
	}

	/**
	 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
	 * one of the sections/tabs/pages.
	 */
	public class SectionsPagerAdapter extends FragmentStatePagerAdapter {

		private List<BudgetDetails> budgets;

		public SectionsPagerAdapter(FragmentManager fm,
				List<BudgetDetails> budgets) {
			super(fm);
			this.budgets = budgets;

			final SectionsPagerAdapter that = this;
		}

		@Override
		public Fragment getItem(int position) {

			Fragment fragment = new BudgetDetailsFragment();
			Bundle args = new Bundle();
			args.putInt(BudgetDetailsFragment.ARG_BUDGET_ID,
					budgets.get(position).getId());
			fragment.setArguments(args);

			return fragment;
		}

		@Override
		public int getItemPosition(Object object) {
			return PagerAdapter.POSITION_NONE;
		}

		@Override
		public int getCount() {
			return budgets.size();
		}

		@Override
		public CharSequence getPageTitle(int position) {
			return budgets.get(position).getName();
		}

		public BudgetDetails getBudget(int index) {
			return this.budgets.get(index);
		}

		public void removeBudget(int index) {
			this.budgets.remove(index);
			this.notifyDataSetChanged();
			//TODO : A optimiser car appelle getItemPosition() qui provoque un rafraichissement de toutes les sections visibles
		}
	}
}
